import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 维护倒排索引所需要的哈希表
 * @author sweets
 */
public class HashTable {
	/**
	 * map存放一系列 单词-<文件名-出现次数>的键值对
	 * 例如 地图-<文件一,5><文件二,7><文件三,1>
	 * 	   出行-<文件一,2><文件二,1>
	 */
	private Map<String, Map<String,Integer>> map=new HashMap<>();
	/**
	 * path指向hash table在文件中存储的位置，迁移到web项目中可以写在配置文件中，然后在程序中读取
	 */
	private static final String HASH_TABLE_PATH="/Users/sweets/Documents/老挝语/学习/hashTable.txt";
	
	/**
	 * 创建类时载入文件,若不存在文件，则map为new HashMap<>()
	 */
	public HashTable(){
		try {
			map=FileUtil.readHashTxt(HASH_TABLE_PATH);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 每日维护后重新保存一次hashmap
	 */
	public void saveData(){
		try {
			FileUtil.writeToTxt(map, HASH_TABLE_PATH);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 对某个文件创建索引并添加到map中
	 * @param filepath
	 */
	public void createIndex(String filepath){
		ArrayList<String> list = new ArrayList();
		Map<String, Integer> numsMap=new HashMap<>();
		
		//读取文件的整个内容、获得分词后的单词列表
		try {
			String wholeFileContent=FileUtil.readToString(filepath);
			list=IKAnalyzerUtil.Seg(wholeFileContent);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		for (String string : list) {
			//判断单词是否在map中 ，不在，则在map中添加
			if (!map.containsKey(string)) {
				numsMap=new HashMap<>();
				numsMap.put(filepath,1);
				map.put(string, numsMap);
				}else {
				//单词已经有，获得map中单词对应的numMap
				numsMap=map.get(string);
				//如果没有包含过此文件名，则把文件名放入
					if (!numsMap.containsKey(filepath)) {
						numsMap.put(filepath, 1);
					}else{
						//有此文件的记录，则将出现次数加1
						int value=numsMap.get(filepath);
						numsMap.replace(filepath, value+1);
					}
				}
			}
	}
	
	
	/**
	 * 测试方法，完了删掉
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		HashTable hashTable=new HashTable();
		String filepath="/Users/sweets/Documents/老挝语/学习/test2.txt";
 		hashTable.createIndex(filepath);
		hashTable.saveData();
		hashTable.searchKey("apk");
	}
	
	
	
	
	
	/**
	 * 在hash table中查询某一个关键字
	 * @param key
	 * @return List<Map.Entry<String,Integer>> 返回有序的文件名+出现次数的列表
	 */
	public List<Map.Entry<String,Integer>> searchKey(String key){
		Map<String,Integer> numMap=map.get(key);
		List<Map.Entry<String,Integer>> list=new ArrayList<>();
		list.addAll(numMap.entrySet());
		ValueComparator vc=new ValueComparator();
		//java collection 的排序方法，不了解的话可以百度一下
		Collections.sort(list,vc);
		for(Iterator<Map.Entry<String,Integer>> it=list.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}
		return list;

	}
	
	/**
	 * 实现一个比较接口，用以对numMap进行排序
	 * @author sweets
	 *
	 */
    private class ValueComparator implements Comparator<Map.Entry<String, Integer>>  
	    {  
	        public int compare(Map.Entry<String, Integer> mp1, Map.Entry<String, Integer> mp2)   
	        {  
	            return mp2.getValue() - mp1.getValue();  
	        }  
	    } 
    
}
